Not currently included:
looking into the dataset of GR1-GR12 we may wonder why some of the grants recieve thousands of dollars of crowd_fund while some others really recieve nothing. why contributers showed more interest to some grants? is there any relationship between the category of grants and the attention it recieved?
in this work, we are going to find answers for this kind of questions let’s dive in.
import pandas as pd
data = pd.read_csv('Grants Results History Round over Round + Grant over Grant - GR1-GR12.csv')
in the first step we plot the number of grants(rows) for each round:
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
sns.countplot(data.round_number)
plt.ylabel('number of grants')
as we can see, the overall trend in number of grants is ascending. only in GR7 and GR8 this trend is a bit different, which may be because of the large growth in GR6 (compared with GR5). between GR7-GR11 the ascending trend is moderate and the growth is slow. but in GR12 again there is a huge growth (compared with GR11). this large growth (106%) is awesome, but keeping the ascending trend after this round is going to be harder.
the other important data is the number of grants with 0 or 1 unique contributer. let’s plot this number for each round:
zero_one_c = data[data['num_unique_contributors'] <=1]
plt.figure(figsize=(18,6))
sns.countplot(zero_one_c.round_number)
plt.ylabel('number of grants with 0 or 1 contributor ')
based on this graph, in GR6 and GR12 there is a large number of grants which did not have any contributer (or just 1). specifically in GR12 there are 1034 grants of all 1813, with 0 or 1 contributer. this means that 57% of the grants in GR12 are not supported!!! this value was about 3.8% for GR11. so what happened in GR12? why many grants remained unsupported? this is so important because may cause people be unmotivated for the next rounds. i did not find an good statistical answer for this questions. but one reason maybe the large number of grants in GR12. the other reason maybe the quality of this projects and how much these projects are valuable for contributers. and the last thing may be the good social media team which plays a significant role in helping people be familiar with grants.
another worth mentioning thing is the category of grants. if we know what categories are more important for contributers, we will have better vision. so, in order to have a better sense, we can use the parameter of the number of unique contributers and plot its distribution by category. first of all we should clean data and then plot the pie chart:
data['match_amount'] = data['match_amount'].str.replace(',', '').str.replace('$', '').astype(float)
## <string>:1: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True.
data['crowdfund_amount_contributions_usd'] = data['crowdfund_amount_contributions_usd'].str.replace(',', '').str.replace('$', '').astype(float)
data12 = data[data['round_number'] == 12]
distribution of unique contribtions for each category(GR1-GR12):
g_b = data.groupby("category")['num_unique_contributors'].sum()
pie, ax = plt.subplots(figsize=[15,15])
labels = g_b.keys()
plt.pie(x=g_b, autopct="%.1f%%", labels=labels, pctdistance=0.9)
plt.title("unique contributions per category(GR1-GR12)", fontsize=18);
pie.savefig("unique_contributions_per_category.png")
knitr::include_graphics("unique_contributions_per_category.png")
distribution of unique contribtions for each category(only GR12):
g_b = data12.groupby("category")['num_unique_contributors'].sum()
pie, ax = plt.subplots(figsize=[12,12])
labels = g_b.keys()
plt.pie(x=g_b, autopct="%.1f%%", labels=labels, pctdistance=0.8)
plt.title("unique contributions per category(only GR12)", fontsize=20);
pie.savefig("unique_contributions_per_category.png")
knitr::include_graphics("unique_contributions_per_category.png")
as we can see in both graphs, this 3 categories have the most unique contributers in all rounds:
in GR12 we can see less diversity in categories but those 3 categories still have the most contributers.
we can also plot the distribution of crowd funding in each category to compare the result with the last two graphs. so we plot crowdfund amount contributions by category (GR1-GR12):
g_b = data.groupby("category")['crowdfund_amount_contributions_usd'].sum()
pie, ax = plt.subplots(figsize=[15,15])
labels = g_b.keys()
plt.pie(x=g_b, autopct="%.1f%%", labels=labels, pctdistance=0.8)
plt.title("crowdfund amount per category(GR1-GR12)", fontsize=20);
pie.savefig("crowdfund_amount_per_category.png")
knitr::include_graphics("crowdfund_amount_per_category.png")
we can see that still those 3 categories are in Top. just the order of them changes a bit:
from this graph and previous 2 graphs, we can conclude that contributers have more tendency to fund in dAPP Tech, community and Infra Tech categories.But is it the whole story? let’s go into some more details and plot the pie chart of the number of grants in each category from GR1 to GR12.
g_b = data.groupby(['category']).size()
pie, ax = plt.subplots(figsize=[16,16])
labels = g_b.keys()
plt.pie(x=g_b, autopct="%.1f%%", labels=labels, pctdistance=0.7)
plt.title("number of grants category(GR1-GR12)", fontsize=20);
pie.savefig("num_grants_per_category.png")
knitr::include_graphics("num_grants_per_category.png")
we see that the community, dAPP Tech and Infra Tech are still in top. comparing this result with last 3 graphs, we can say that the number of contributions and crowd_funds is high for this 3 categories because these are the most categories which the contributers could see in the rounds. this is a better justification and makes sense.
so far we discussed the number of grants each round, grants with 0 or 1 contributers and the popularity of categories. now let’s talk about the regions. we can plot the distribution of grants by region:
plt.figure(figsize=(18,6))
sns.countplot(data.region)
plt.ylabel('number of grants')
as we can see, most of grants are from north america and europe, and many of them are undefined or none. but one question:
Question: is there any relationship between the region of each grant and the number of contributions it recieved?
this question can be asked because people may have unintentionally bias in favor of some regions and this can be the cause of more contributions to that grants. so let’s go in more statistical details. to answer this question we should compare the distribution of contributions by region with the distribution of grants by region and see if they are similar or not. so, first we plot the distribution of contributions by region:
g_b = data.groupby("region")['num_contributions'].sum()
pie, ax = plt.subplots(figsize=[16,16])
labels = g_b.keys()
plt.pie(x=g_b, autopct="%.1f%%", labels=labels, pctdistance=0.9)
plt.title("contributions to each region(GR1-GR12)", fontsize=20);
pie.savefig("contributions_to_regions.png")
knitr::include_graphics("contributions_to_regions.png")
and also we need the pie chart of distribution of grants by regions:
g_b = data.groupby(['region']).size()
pie, ax = plt.subplots(figsize=[16,16])
labels = g_b.keys()
plt.pie(x=g_b, autopct="%.1f%%", labels=labels, pctdistance=0.9)
plt.title("distribution of grants over regions(GR1-GR12)", fontsize=20);
pie.savefig("distribution_to_regions.png")
knitr::include_graphics("distribution_to_regions.png")
as we can see in both graphs, north america, europe and east asia are at the Top and the percents are almost similar. so, this means that there isn’t any bias.** the number of contributions are high for this regions because the majarity of grants are from this regions.**
our first question still remains: why some grants recieve more attention and contributions? we saw that the category and the regoin of the grants are possibly not determining factors. so, it’s worth considering to investigate the top grants and see what are they proposing and what are they talking about. one good way of doing this, is to find the Mega words of this grants. so, we can use the “about” section of their site(or anything similar) and find this words.
top_num_uniq = data.sort_values('num_unique_contributors', ascending=False).head(5)
aax = top_num_uniq.plot.bar(x='grant_id', y='num_unique_contributors', rot=0, figsize=(18,6))
the first grant which recieved the most unique contributions, with grant_id = 3133:
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
text = ''' Li.Finance is a mesh of aggregated cross-chain bridges and protocols to power next-gen DeFi projects with superior UX by making liquidity available when needed.
For starters: „Think of LiFi as a 1inch for cross-chain liquidity networks (Connext, Hop, Thorchain, Anyswap, Ren, RouterProtocol, etc..)“
Our Thesis
The Future is multi chain with Ethereum being the biggest player
Cross-chain bridging solutions will play a major role in future DeFi-Enablement and Layer 2 adoption
Aggregation will pave the way for mass adoption of layer 2 and the multi-chain environment we'll live in, benefitting the whole ecosystem.
Problem
The problem comes in three ways:
Protocols like Connext and Hop are focusing on bridging liquidity between EVM based chains and layer 2 scaling solutions, while Thorchain, Anyswap and others are focusing on bridging to different layer 1s. They all need to fill large liquidity pools and come at different levels of speed, security and trust. It will also take a lot of time for them to get up to speed supporting true any-to-any swaps across chains.
Users always need to find a way to get their funds from A to B and have almost no clarity about which solution or bridge to take.
Dapp developers are suffering from a lot of communication overhead, trying to teach their users how to use their products and which bridges to take. A lot of friction and reduced conversion rates.
Solution
A data mesh of cross-chain liquidity sources: networks, DEXes and liquidity providers:
Aggregate cross-chain liquidity pools like Connext, Hop, RouterProtocol, Thorchain, Chainflip, Anyswap, etc. and make sure to always know their liquidity pools
On top of that, connect to all DEXes and DEX aggregators like 1inch on all chains to be able to to facilitate any-to-any swaps
For arbitrageurs and the impatient user, allow to connect to lending protocols on spot.
All of this will not only be made available as a dapp, but also as a widget for other dapp developers, so that users won't have to leave dapps anymore in order to get their funds to where they need it.
Team
Max and Philipp have been working together for over 8 years, spent 6 years bootstrapping stomt.com and developed over 30 thirdparty integrations, a highly scalable web platform, APIs and cross-platform mobile apps. Philipp did business development in >14 countries and was frequently booked as speaker.
March
Launched 10k-lazy minting NFT project on Ethereum
1 prize at NFTHack ETHGlobal Hackathon
April
Hired/Onboarded our first additional developer
4 prizes at ScalingEthereum ETHGlobal Hackathon
May
3 prizes at Web3 ETHGlobal Hackathon
Joined KERNEL Block III
June
1st speaking slot at crypto summit
$50.000 Grant from Connext
July
Started switching to NXTP (Connext new protocol)
August
Helped the Connext team to launch xpollinate.io v2
Why do we need this grant?
We've already onboarded one developer to crypto and through years of experience we have access to a lot of other developers whom we trust and like to onboard. For that we need to be able to pay them. Our project is huge and will take a longer time to get built, secured and optimized.
Why should you invest in this?
LiFinance will have an immediate impact on future dapps, layer 2 scaling adoption and DeFi summer 2.0
LiFinance will power the official interface of Connext
An experienced team that shares a lot of trust and entrepreneurial spirit
Are you also fundraising?
Yes, soon. We're currently finishing the HackMoney hackathon and apply for a couple of grants. After that we'll start fundraising from business angels and protocol founders. People who we think can make a difference through knowledge, network or integration of our widget.'''
norm_msg_cloud = WordCloud(width =520, height =260, max_font_size=50,
background_color ="black", colormap='Blues').generate(text)
plt.figure(figsize=(16,10))
plt.imshow(norm_msg_cloud, interpolation='bilinear')
plt.axis('off') # turn off axis
## (-0.5, 519.5, 259.5, -0.5)
plt.show()
as we can see this grant is mostly talking about this topics:
2nd grant with grant_id = 490 :
text = ''' t's been a busy quarter for POAP. We worked very hard and minted thousands of tokens, making lots of people happy on the way. We are always happy to receive your support, not only in funding but also in words of appreciation and help communicating our spirit. Thanks !
Hey everyone!
We’re excited to announce our first ever Gitcoin Grant application.
If you’ve yet to experience some POAP magic - you may recall receiving an NFT badge at one of the many Ethereum events we’ve been blessed to partner with. Some highlights (in a visually appealing order) include:
EthCC (Paris, France)
Devcon (Osaka, Japan)
Dappcon (Berlin, Germany)
EthDenver (Colorado, USA)
EthGlobal (Waterloo, Boston, Bangalore, London, etc)
What is POAP?
POAP - short for Proof of Attendance Protocol - provides event nomads with a way to verify their attendance through collecting digital badges, all of which live onchain. Each badge is unique, meaning that the only way to claim one is to physically (or digitally) receive it at the event.
For those of you who love to flex all the Ethereum events you’ve attended over the past year, POAP is your ticket for ultimate crypto clout.
It seems like people like to flex, as we’ve distributed roughly 7000 badges across more than 60 coveted events.
Why Gitcoin Grants?
While our journey has been incredible, what you might not know is that the entire project has been volunteer oriented, meaning we’ve funded everything - both time and money - in house. We’ve turned down ETH Killers and other avenues which we felt tarnished the purity of what we’re looking to build.
This means that everything from gas cost wars to travel, distribution and dealing with Japanese customs accusing us of smuggling drugs has been out of pocket due to our love for Ethereum and the wider community.
We’ve been lucky enough to work with and receive support from Ethereum’s best and brightest talents, all of which are highlighted in POAP’s journey since its creation at ETHDenver in 2019.
While we're extremely saddened by the fact that all of our events where we planned to bring our magic have been cancelled or postponed because of Covid-19, we won’t let it detour our wizardry!
While in quarantine, we’ve been heads down working on adding new features, governance tools and enhanced swag to hit the Ethereum circuit in full force in the coming years!
Using POAP we can:
Host targeted airdrops to badge recipients of specific events
Use badges as sentimental collateral for lending
Allow badges to be used as proxy for special governance polls
Partner with projects like Kickback for unique redemption schemas
Crown the “Ethereum Vagabond” based on the number of events attended
The possibilities are truly endless and we plan on using our Gitcoin Grant funding to help expand our ecosystem awareness and build out a suite of killer features to take the project to the next level.
If you’ve ever gotten some POAP swag and want to express your appreciation, this is your chance!
Any amount you donate (one time or recurring) is very welcome.'''
norm_msg_cloud = WordCloud(width =520, height =260, max_font_size=50,
background_color ="black", colormap='Blues').generate(text)
plt.figure(figsize=(16,10))
plt.imshow(norm_msg_cloud, interpolation='bilinear')
plt.axis('off') # turn off axis
## (-0.5, 519.5, 259.5, -0.5)
plt.show()
this grant is talking about this topics:
3th grants with grant_id = 2323 :
text = '''Dark Forest is an MMO strategy game built with zkSNARKs on Ethereum and xDAI. Players explore an infinite, procedurally-generated universe, conquering planets and growing a space empire. More info: zkSNARKs for blockchain gaming
Over 2,500+ crypto enthusiasts have participated in the first four whitelisted Dark Forest rounds, spending over one trillion gas on xDAI chain and the Ropsten testnet. This playerbase represents about 15% of our current waitlist, and we're excited to continue development so that we can open up the game to more players.
>>> What have we been up to?
After the previous Gitcoin grant round concluded, we launched DF v0.6 Round 4, aka The Lightning Round. We’ve also seen an abundance of life come from within the community in the form of the Dark Forest Community Art Contest, MarrowDAO’s recent Dark Forest Community Round, and d_fdao's recently announced Dark Forest Community New Year's Round!
We are actively seeking a front end web developer. (Sign up for the Dark Forest Jobs newsletter if you’d like to be notified of new openings!)
We’ve got one more round of v0.6 left, which will likely launch in Q1 2022. After that, we plan to embark on the next stage of our development cycle: v0.7. In addition to releasing rounds ourselves, we are enabling individual players and DAOs to deploy their own rounds, adding a unique spin to our core game.
Throughout 2022, we hope to facilitate the launch of many community rounds, so that players can play the game without having to wait for our months-long release process. Your contributions, in addition to fostering the growth of Dark Forest, will help make that happen.
We’ve learned a ton from shipping this game for our enthusiastic audience, and are eternally grateful for the opportunity to build such an outlandish piece of software.
Join the Dark Forest Discord if you'd like to get involved.
Decentralized Digital Worlds: We want to build a massively-multiplayer persistent and economic universe, interoperable with the rest of the Ethereum metaverse. We believe that zkSNARKs will unlock the first generation of truly compelling decentralized games, and that decentralized games will pave the way for the community-owned and community-designed digital worlds of the future.
Community-driven: Beyond working on the Dark Forest game itself, our team also works closely with Project Sophon, a group of players working on third-party tools. Our vision is for the Dark Forest gameplay experience to be built and freely modified by the community. For a taste of this, see the Dark Forest Community Plugins Homepage.
ETH/ZK Education: We're also spending time on community and education initiatives aimed at bringing both Ethereum and zero-knowledge application development to more students and developers, including educational programs, starter repos and shared infrastructure, and more (to be announced on our blog in the coming weeks!)
Our work so far has been supported by a handful of one-off developer grants from organizations like xDAI, the Mozilla Builders program, and an in-game tip jar. Additionally, we are now funded by a new research foundation: 0xPARC. You can read more about it here.
We're so thankful to be a part of this ecosystem and we're excited to keep building for you all! :) '''
norm_msg_cloud = WordCloud(width =520, height =260, max_font_size=50,
background_color ="black", colormap='Blues').generate(text)
plt.figure(figsize=(16,10))
plt.imshow(norm_msg_cloud, interpolation='bilinear')
plt.axis('off') # turn off axis
## (-0.5, 519.5, 259.5, -0.5)
plt.show()
this grant named dark forest and is more talking about:
4th grant with grant_id = 4352
text = '''
Vision
ZigZag wants to be a revolutionary project in the ZK Rollup space and aims at the end-game scaling solutions for Ethereum. We want to be the first, we want to be the best. We want to push out great products with high quality as fast as possible. We do not limit ourselves. Our vision is not to launch a mediocre DEX. Instead, we are aiming to bring the usability of centralised exchanges to a DEX that previously was not possible. With ZK Rollups, it is. Having sufficient liquidity and orderbook depth is a key factor that holds back a lot of DEXs from succeeding, which is what our main aim is to get right.
Introduction
ZigZag is a decentralised orderbook exchange that utilizes ZK-Rollup tech by allowing traders to perform spot trades with minimal slippage and thick orderbooks. The problem that every AMM-based DEX has on other Layer 2 Rollups is having miniscule liquidity. For simple swaps the impact on price movement is not significant. However, if one is attempting to trade with size relative to over $500k, to get the best quotes it is necessary to bridge back to mainnet Ethereum and pay its fees for aggregated liquidity that is available there. ZK Rollups can solve this by offering negligible fees on transactions, allowing for any market inefficiency to be taken advantage of in an instant by market makers, which was previously not possible on a DEX. We are aiming to acquire sufficient liquidity to the extent that users will not have to pay Ethereum gas fees on mainnet in order to get quoted for a similar price.
We launched as the first and still the only DEX on zkSync 1.x. We will also launch as the first DEX on StarkNet, which you can currently try out on our testnet (limited functionality). Due to our first mover advantage we are capturing a lot of attention. Our volume has been breaking records every week. Last week we had a total volume of $52M with a record breaking day of $13.2M in volume on the last day of the week.
Team background
Our team derives from crypto natives who are all experienced traders. Having personal experience in using decentralized exchanges allows us to recognize what is required for a DEX to succeed. The founder of ZigZag is a leading developer in Solidity, but we dare to say he is one of the, if not the best, Cairo dev out there. Our founder coded most of our DEX on zkSync and is the reason we exist and captured the first mover advantage we have. Another experienced dev joined our team recently and focuses on StarkNet and coding a non-custodial liquidity pool for market makers. With these guys we have a confirmed advantage and head start over any other competition building on StarkNet. Our team is joined by a small group of experienced devs who are very committed to helping us expand ZigZag even more. We are also in contact with most of the big and small players that are building next to us and are looking forward to collaborating with anyone for the good of Ethereum’s scalability.
With our combined skills, trading knowledge and maybe most importantly full-time commitment, we have the ability to create a leading DEX on zkSync and StarkNet from the development side, as well as ensuring that the incentives for traders are sufficient for them to not require an alternative.
Achievements and future plans
Currently, we have our exchange live on zkSync 1.0. We’re using the native zkSync atomic swap feature to match orders. The gas fee is paid to the relayer and included in the atomic swap. We also made a bridge UI that taps into zkSync’s smart contract to bridge between Ethereum and zkSync. We have a StarkNet testnet up, but right now with limited functionality. However, this will soon change as Starkware is moving quickly. Be sure to check out our announcements. Furthermore, our governance proposal for Frax passed (https://gov.frax.finance/t/fip-36-frax-x-zigzag-partnership/272): Frax will provide us for a total of $20M in liquidity. The first millions have arrived. This liquidity will be used to keep our DEX liquid on zkSync for now and once StarkNet fully launches we will move the majority of our liquidity there since it will have more functionality. We also have a MIM proposal up (https://forum.abracadabra.money/t/proposal-bring-mim-onto-starknet-through-zigzag-exchange/1065) to kickstart our DEX on StarkNet, since StarkNet will have more functionality than zkSync 1.0 currently has.
Limit orders and margin trading will be possible on StarkNet and zkSync 2.0. On StarkNet we are also building a non-custodial liquidity pool that market makers can tap into to use and market make on our DEX. We can turn this into a dAMM. As said before, we made a bridge UI for zkSync, but we are working on a fast withdrawal mechanism. We’re also working on a bridge UI for StarkNet and will provide fast withdrawals there too. Another future plan is adding more bridges to our website. One that has the most priority would be zkSync <-> StarkNet. We are thinking further into the future about implementing NFT related features on zkSync: viewing and sending NFTs on our website. We would later turn this into the first NFT Marketplace.
We’re eagerly awaiting zkSync 2.0, which will be zkEVM. This will give us way more possibilities on our DEX. We might even build on other Layer 2 ZK Rollups if we have the developer capacity for it. Once Loopring, ZKSwap and Polygon Hermez are zkEVM, we could start building there.
Reasoning for grant
As the first DEX on zkSync we've been very active in the zkSync ecosystem, but also with the community and catering to them. One of the few live use cases on zkSync right now, besides our DEX, is donating to Gitcoin grants. This can be done in a cheap way by either by bridging funds from Ethereum Layer 1 -> zkSync Layer 2 (https://trade.zigzag.exchange/bridge) or by using a fiat ramp like Ramp Network (https://ramp.network/) to zkSync. These Gitcoin grants created demand for DAI, so a while back we added DAI pairs to our exchange (ETH/DAI, WBTC/DAI, DAI/USDC, DAI/USDT). A lot of people started using ZigZag to grab DAI for Gitcoin grants and started requesting us to create our own grant. They wanted to donate to us! We decided to open a Twitter poll (https://twitter.com/ZigZagExchange/status/1469983150180909057) and after 1 day more than 1300 people voted "Yes", telling us that they would want to donate to us. This gave us great confidence in creating our own grant.
Use of funds
As seen in our tweet, we are self funding right now. This Gitcoin grant will give us the ability to spend more funding on development. We would love to scale up our development team and with the support of our community it seems like we will be able to do this. Development can mean anything ranging from frontend and backend development to GFX/UI/UX design.
Developer? Contact us!
We would love to hear your feedback on our product, so please use our exchange, read our code in Github and join our community. If you are interested in our project and think that you could help us out or even contribute to building on ZK Rollups, don't hesitate and contact us here: https://info.zigzag.exchange/#contact. With our grant donations we will be able to take onboard more developers and maybe that person will be you! Who knows we’ll even see you on our team in the future! '''
norm_msg_cloud = WordCloud(width =520, height =260, max_font_size=50,
background_color ="black", colormap='Blues').generate(text)
plt.figure(figsize=(16,10))
plt.imshow(norm_msg_cloud, interpolation='bilinear')
plt.axis('off') # turn off axis
## (-0.5, 519.5, 259.5, -0.5)
plt.show()
the main topics in this grant are:
and the 5th with grant_id = 172 :
text = ''' ZeroPool is an experimental non-custodial cost-efficient privacy solution for Ethereum. ZeroPool isn’t a transaction Mixer or something similar. It’s better to think of ZeroPool as a black box. Inside this black box, you can transfer, swap, and store different types of Ethereum assets with a strong privacy set. Before we go further, it’s good to define the notions of anonymity, privacy, and strong privacy that we are going to be used further.
Anonymity is a common feature for public blockchains such as Bitcoin. It’s simply the fact that wallet addresses can’t be directly associated with a specific person unless the person exposes that. Also, a user can have as many wallets as he wants, which are not linked with each other. Nevertheless, the fact that transaction has happened and transacted amount between anonymous wallets are still exposed and available for everyone. At that point, I would like to separate weak and strong privacy for further usage in the article.
Weak privacy: the transacted amount is hidden, but the receiver and sender addresses, as well as transactions graph, is publicly available.
Strong privacy: the transaction graph itself is hidden, 3rd party observers can’t make any assumptions out of it.
There are blockchains that have strong privacy as a core feature, such as ZCash. In this public blockchains, 3rd party observer can’t restore the transaction graph but can verify that blockchains don’t have defects like double spends, or money created from nowhere.
Ethereum doesn’t have privacy features out of the box. However, we have a wide range of smart contract capabilities and several working designs of second-layer solutions. Combining these two things enhanced by Zero-Knowledge cryptography, we can bring missing privacy features into Ethereum.
It’s worth mentioning that there are other projects focused on building strong and weak privacy solutions with there own pros and cons. But ZeroPool is the one that is focused on strong privacy and cost-efficiency.
From a technical perspective, ZeroPool is based on optimistic Rollup. You can find a good explanation of what optimistic Rollup is over here. Rollup gives us an option to make transactions cost-efficient in terms of gas consumption. Using rollup, we move all expensive zkSNARKs computation off-chain. More explanations on ZeroPool under the hood is here: ethresear.ch.
ZeroPool BETA Release
At EthCC, we presented unaudited public beta available both mainnet and testnet. It’s unaudited, so you can use it at your own risk only.
Here how it looks like. First, you generate a ZeroPool account, just like a regular Ethereum account using a seed phrase, with one exception that ZeroPool uses a zkSNARK friendly babyJubJub elliptic curve.
Account creation
New ZeroPool account creation
Then you see the main screen of the app whenever you try to do your first deposit or transaction app would ask you to make a gas donation.
Main screen & Gas donation request
ZeroPool gas fees are paid to the Relayer for publishing encrypted user transactions within a ZeroPool block in the mainnet smart contract. This smart contract is a key part of Rollup design as well as Relayer. A relayer basically is a server that verifies and aggregates transactions into blocks. Relayer could be a single machine or decentralized network. It’s a matter of particular technical design.
Once users donate gas on the Ethereum Mainnet, we will get an equal amount of ETH on the gas network.
The tricky part here is that we also need to hide gas payments. For this purpose, we simply use the same smart contract and cryptography but on the side chain. In that way, gas spending becomes hidden, just like regular ZeroPool transactions.
After the gas donation is made, you can make a deposit from Ethereum Mainnet to ZeroPool. At that moment, ZeroPool gas is required to transfer ownership of your deposit to your ZeroPool account. Since that point, no one will actually know what your actual ZeroPool address is, because the encrypted transaction contains only a proof of your deposit spent but not your actual address. Thus neither Relayer or any other ZeroPool user won’t be able to identify the owner of the funds.
Once you have ZeroPool balance you can transfer it to another ZeroPool user:
Transfer within ZeroPool
On the other hand, a user that you send money has to wait for the block to be published on ZeroPool smart contract, the client will try to decode all 256 transactions within the block, but what he will actually see is the proof that his balance has increased.
Finally, we have a withdrawal feature implemented as a regular optimistic Rollup withdrawal procedure that require some time-to-finality to be passed.
Withdraw procedure with fraud-proof challenge window
Further plans
At the moment we work on the migration of our codebase to Rust, and there are several reasons for that:
The key thing for production-ready release is a Trusted Setup Procedure. There is a battle-tested codebase for a trusted setup.
So far, we have built a browser version that requires Native BigInt support. Unfortunately, it’s not available on iOS. To fix that, we are going to package all computational-extensive parts into a WebAssembly.
The first step that we made is a core lib written in pure Rust. You can find it on our Github as well as all other code that is open source under MIT and Apache license'''
norm_msg_cloud = WordCloud(width =520, height =260, max_font_size=50,
background_color ="black", colormap='Blues').generate(text)
plt.figure(figsize=(16,10))
plt.imshow(norm_msg_cloud, interpolation='bilinear')
plt.axis('off') # turn off axis
## (-0.5, 519.5, 259.5, -0.5)
plt.show()
and this grant is talking more about this topics:
this words are so important because they slightly show the tendencies of Gitcoin/Ethereum community or to be more precise, the contributers.
a few predictions about GR13:
the final section is about GR13. we analyzed all this columns and rows up to here, to find something hidden in data which can be usefull, in order to correct ourselves and do better in the next rounds. so, what can we find from this trends, about GR13? let’s see.
first we plot the number of unique contributions in each round:
df2 = pd.DataFrame(data.groupby("round_number")['num_unique_contributors'].sum())
df2
## num_unique_contributors
## round_number
## 1 127
## 2 179
## 3 1693
## 4 4481
## 5 4993
## 6 7604
## 7 10791
## 8 20122
## 9 118994
## 10 235877
## 11 340871
## 12 356895
aax = df2.plot.bar(y='num_unique_contributors', rot=0, figsize=(18,6))
as we can see in the graph, the number of unique contributers are growing from GR1 to GR12. the speed of growing increased from GR9. so, with this speed, what will be the number of contributers in GR13?
we need to extrapolate this data:
import numpy as np
from scipy import interpolate
from scipy.optimize import curve_fit
x = df2.index.values
y1 = df2.num_unique_contributors.values
pr1 = interpolate.interp1d(x, y1, fill_value = "extrapolate")
print(f"Estimated number of uniqe contributions for GR13 : {int(pr1(13))}")
## Estimated number of uniqe contributions for GR13 : 372919
our extrapolation says that the Estimated number of uniqe contributions for GR13 will be about 372919. we should be ready for that.
also for the amount of crowdfund contributions:
df2 = pd.DataFrame(data.groupby("round_number")['crowdfund_amount_contributions_usd'].sum())
aax = df2.plot.bar(y='crowdfund_amount_contributions_usd', rot=0, figsize=(18,6))
y2 = df2.crowdfund_amount_contributions_usd.values
pr2 = interpolate.interp1d(x, y2, fill_value = "extrapolate")
print(f"Estimated amount of crowdfund for GR13 : ${int(pr2(13))}")
## Estimated amount of crowdfund for GR13 : $4517640
the Estimated amount of crowdfund contributions for GR13 will be about $4517640.
and finally the matching amount:
df2 = pd.DataFrame(data.groupby("round_number")['match_amount'].sum())
aax = df2.plot.bar(y='match_amount', rot=0, figsize=(18,6))
y2 = df2.match_amount.values
pr2 = interpolate.interp1d(x, y2, fill_value = "extrapolate")
print(f"Estimated match_amount for GR13 : ${int(pr2(13))}")
## Estimated match_amount for GR13 : $5251383
the Estimated matching amount for GR13 will be about $5251383.
we asked some questions at the begining of this work, and tried to find answers from the dataset.
the important things we found can be summerized like this:
the large growth from GR11 to GR12 (106%) is awesome, but keeping the ascending trend after this round is going to be harder.
57% of the grants in GR12 are not supported and finding the cause of this is so crucial
3 categories which have the most unique contributers and crowdfund in all rounds are dAPP Tech, community and Infra Tech. we saw that this happened because these are the most of grants are in this categories and it’s natural to recieve more attention.
grants which are from north america, europe and east asia also recieved most contributions. we say that the number of contributions are high for this regions because the majarity of grants are from this regions.
we found the megawords of the grants with most contributions and see that this topics are speak louder: game, community, decenteralization, liquidity, exchange, POAP, pricvacy and Thorchain.
finally we estimated this values for GR13:
number of uniqe contributions: 372919
amount of crowdfund: $4517640
match_amount: $5251383
import re
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
data_dir = Path('.')
data_dir
## PosixPath('.')
# data.csv is the first sheet in this google sheet
# https://docs.google.com/spreadsheets/d/1OsJ_nmN9mN-i_9h3Yj2mDfjvtsP1qvv3B1zcpER62dk/edit#gid=1223173410
df = pd.read_csv(data_dir/'Grants Results History Round over Round + Grant over Grant - GR1-GR12.csv', parse_dates=['round_start_date', 'round_end_date'])
print(df.shape)
## (5906, 13)
df.head()
## round_number ... total
## 0 12 ... $443,838.93
## 1 12 ... $286,988.88
## 2 12 ... $283,574.44
## 3 12 ... $184,010.75
## 4 12 ... $154,504.96
##
## [5 rows x 13 columns]
def usd_to_int(x):
return float(re.sub('[$,]', '', str(x)))
usd_to_int('$129,131.34')
## 129131.34
usd_cols = ['match_amount', 'crowdfund_amount_contributions_usd', 'total']
df[usd_cols] = df[usd_cols].applymap(usd_to_int)
# Fillna
df['region'].fillna('undefined', inplace=True)
df.fillna(0, inplace=True)
df.head()
## round_number round_start_date ... crowdfund_amount_contributions_usd total
## 0 12 2021-12-01 ... 103838.93 443838.93
## 1 12 2021-12-01 ... 58715.04 286988.88
## 2 12 2021-12-01 ... 95279.64 283574.44
## 3 12 2021-12-01 ... 7815.29 184010.75
## 4 12 2021-12-01 ... 25373.62 154504.96
##
## [5 rows x 13 columns]
Just view how values such as total, contributions etc has increased over the grants. I added another column which the average of total.
round_cols = ['round_number', 'round_start_date', 'round_end_date']
round_df = df[round_cols].drop_duplicates(ignore_index=True)
round_df['round_duration'] = (round_df['round_end_date'] - round_df['round_start_date']).astype('timedelta64[D]')
round_df = round_df.set_index('round_number', drop=True)
round_df['no_of_grants'] = df.groupby('round_number').count()['round_start_date']
contributions = df.groupby('round_number').sum().drop('grant_id', axis=1)
round_df = round_df.join(contributions)
round_df['total_per_grant'] = round_df['total'] / round_df['no_of_grants']
round_df
## round_start_date round_end_date ... total total_per_grant
## round_number ...
## 12 2021-12-01 2021-12-16 ... 6029524.56 3327.552185
## 11 2021-09-08 2021-09-24 ... 2290025.89 2611.203979
## 10 2021-06-16 2021-07-02 ... 1733505.44 2397.656210
## 9 2021-03-10 2021-03-25 ... 1637344.74 2503.585229
## 8 2020-12-01 2020-12-18 ... 2431090.69 6552.805094
## 7 2020-09-14 2020-10-02 ... 719101.55 2471.139347
## 6 2020-06-16 2020-07-03 ... 355166.61 585.117974
## 5 2020-03-23 2020-04-05 ... 334205.34 1144.538836
## 4 2020-01-06 2020-01-21 ... 256173.09 1685.349276
## 3 2019-09-15 2019-10-04 ... 196995.11 3030.694000
## 2 2019-03-26 2019-04-19 ... 108544.41 3015.122500
## 1 2019-02-01 2019-02-15 ... 38661.10 1486.965385
##
## [12 rows x 10 columns]
fig, axs = plt.subplots(4, 2, figsize=(28, 36))
for i in range(8):
#axs[i//2, i%2].plot(round_df.iloc[:, i+2], '-o')
axs[i//2, i%2].bar(round_df.index, round_df.iloc[:, i+2])
axs[i//2, i%2].set_title(round_df.columns[i+2])
axs[i//2, i%2].set_xticks(round_df.index)
It’s interesting to see everything has been growing from GR1 to GR12 such as number of grants, match amount and contributions. A little change in trend is a spike in GR8, as there were more crowdfund contributions and therefore the peak for the average total amount contributed to grants. Crownfund contribution in GR8 is spectacular and it proves the importance of crowdfund_amount_contributions_usd.
EDIT: Later discovered that the big contributions in GR8 flowed to some big projects mainly from north_america and undefined location.
View how categories and regions have evolved over the grants.
fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True, figsize=(18,6))
categories = df.groupby(['round_number', 'category']).count()['total'].unstack(level=0, fill_value=0)
sns.heatmap(categories, annot=True, fmt='', cbar=False, ax=ax1)
ax1.set_title('No of grants per category')
categories = df.groupby(['round_number', 'category']).sum()['total'].unstack(level=0, fill_value=0)
sns.heatmap(categories, annot=True, fmt='.1g', cbar=False, ax=ax2)
ax2.set_title('Total raised per category')
plt.show()
fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True, figsize=(18,6))
## <string>:1: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_open_warning`).
regions = df.groupby(['round_number', 'region']).count()['total'].unstack(level=0, fill_value=0)
sns.heatmap(regions, annot=True, fmt='', cbar=False, ax=ax1)
ax1.set_title('No of grants per region')
regions = df.groupby(['round_number', 'region']).sum()['total'].unstack(level=0, fill_value=0)
sns.heatmap(regions, annot=True, fmt='.1g', cbar=False, ax=ax2)
ax2.set_title('Total raised per region')
plt.show()
From the heatmap above, funds seem well distributed between various categories and regions. The categories or regions with more grants, had more total funding. The exception is none region (a lot of grants but less fund) and I don’t know why. A look at match_amount (instead of total) has similar pattern. So I guess there’s little to no worry about some regions/categories getting underfunded because of popularity.
In GR8, it could be noticed that north_america and undefined has more grants but still a much larger contributions. The top projects with contribution in GR8 is below.
df[(df['round_number']==8)].sort_values('crowdfund_amount_contributions_usd', ascending=False).head(10)
## round_number ... total
## 4066 8 ... 674332.58
## 4067 8 ... 154414.45
## 4068 8 ... 142078.48
## 4069 8 ... 58145.94
## 4070 8 ... 49679.86
## 4071 8 ... 47422.47
## 4072 8 ... 45440.02
## 4074 8 ... 40798.92
## 4075 8 ... 39610.24
## 4073 8 ... 41549.79
##
## [10 rows x 13 columns]
This is to have an overview of how vocabulary has evolved over the years. What are the buzzwords or trending project in a grant round?
from wordcloud import WordCloud, STOPWORDS
stopwords = set(STOPWORDS)
def get_wordcloud(round):
words = ''
for val in df[df['round_number']==round]['grant_title']:
words += val.lower() + ' '
wordcloud = WordCloud(stopwords=stopwords, min_font_size=3,
width=1600, height=800,
).generate(words)
return wordcloud
fig, axs = plt.subplots(6, 2, figsize=(28, 42))
for i in range(12):
my_round = i+1
axs[i//2, i%2].imshow(get_wordcloud(my_round))
axs[i//2, i%2].set_title(f"Grant round {my_round}")